package 多线程;

/**
 * 该类用于实现数字和字母的交替打印。
 * 使用两个线程分别打印数字和字母，通过同步锁确保交替执行。
 * 时间复杂度：O(1)，空间复杂度：O(1)
 */
public class NumAndLetterPrinter {
    // private static char c = 'a'; // 字母的起始字符
    // private static int i = 0; // 数字的起始值
    static final Object lock = new Object(); // 同步锁对象

    /**
     * 打印数字和字母的方法。
     * 使用同步锁确保线程安全，交替打印数字和字母。
     */
    private static void printer() {
        synchronized(lock) {
            for(int i = 0; i < 26; i++) {
                if(Thread.currentThread().getName() == "numThread") {
                    System.out.println((i + 1)); // 打印数字
                    lock.notifyAll(); // 通知其他线程
                    try {
                        lock.wait(); // 等待其他线程
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else if(Thread.currentThread().getName() == "letterThread") {
                    System.out.println((char) ('a' + i)); // 打印字母
                    lock.notifyAll(); // 通知其他线程
                    try {
                        lock.wait(); // 等待其他线程
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            lock.notifyAll(); // 确保所有线程都能结束
        }
    }

    /**
     * 主方法，启动两个线程分别打印数字和字母。
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        new Thread(() -> printer(), "numThread").start(); // 启动数字打印线程
        new Thread(() -> printer(), "letterThread").start(); // 启动字母打印线程
    }
}
